home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok22.lha / MakeKickRes / ResetFest.dok < prev    next >
Text File  |  1993-08-15  |  5KB  |  132 lines

  1.     RESETFEST - WIE GEHT'S ???      (von Holger Gzella)
  2.     **************************
  3.  
  4. Für manche Anwendungen ist es einfach notwendig, Programme resetfest zu
  5. machen (siehe TURBOPRINT, RAD: etc.). Da gibt es auf dem Amiga zwei Mög-
  6. lichkeiten:
  7.  
  8.     a) Die einfache Methode über die Capture-Vektoren
  9.     b) Die kompliziertere Methode über Resident-Module
  10.  
  11. Ersteres wurde schon häufig besprochen und ist auch nicht für alle Sachen
  12. sinnvoll, da, wenn der CoolCapture-Vektor angesprungen wird, lediglich die
  13. Exec-Library initialisiert ist. Nutzt man aber Resident-Module, so ist das
  14. System zum Zeitpunkt des Aufrufes schon fast hochgefahren. So sind z.B.
  15. Graphics und Intuition initialisiert, das Fast-Memory ist da, usw.
  16.  
  17. In diesem Text soll gezeigt werden, wie Resident-Module selbst geschrieben
  18. werden. Als Demoprogramm dient MakeKickRes.
  19.  
  20. Zuerst muß eine Speicherliste initialisiert werden. Diese muß Platz für
  21. soviele Einträge, wie eigene Resident-Module bieten. In diesem Fall ge-
  22. he ich davon aus, daß nur ein Resident-Modul initialisiert werden soll.
  23. Folgende Liste muß definiert werden:
  24.  
  25.   NewMemList=RECORD
  26.     node      : Node;                    (* Node - wichtig für alle Listen *)
  27.     numEntries: CARDINAL;                (* Anzahl der Einträge - hier 4 *)
  28.     me        : ARRAY[0..3] OF MemEntry; (* 4 Listeneinträge *)
  29.   END;
  30.  
  31. Warum für ein resetfestes Programm vier Einträge benötigt werden, wird noch
  32. erklärt.
  33.  
  34. Der nächste Record, der definiert werden muß, besteht aus zwei Adressen:
  35.  
  36.   PtrTable=RECORD
  37.     adr1: ADDRESS;  (* Wozu das gut ist, kommt noch! *)
  38.     adr2: ADDRESS;
  39.   END;
  40.  
  41. Diese Liste muß nun angepaßt werden. So schreibe man nun in das Feld
  42. numEntries die Zahl 4 und als Nodentyp in das Feld MyMemList.node.type den
  43. Wert memory aus der NodeType-Aufzählung.
  44.  
  45. Nun muß der Code des Programms, das resetfest gemacht werden soll, in einen
  46. mit AllocMem() zur Verfügung gestellten Speicherbereich (chip,memClear und
  47. public) kopiert werden. Der Code MUSS PC-relativ assembliert sein. Daher
  48. ist es leider noch(!) nicht möglich, Modula-Programme zu verankern.
  49.  
  50. Als nächsten Schritt muß man eine Resident-Struktur, die in Exec definiert
  51. ist, patchen. In das Feld matchWord kommt die Konstante matchword, in das
  52. Feld matchTag ein Zeiger auf die Resident-Struktur selbst, in das Feld
  53. endSkip die Adresse des Endes des Resident-Records. In Flags sollte man
  54. coldstart (aus ResidentFlagSet) schreiben, da es sich um ein Programm han-
  55. delt, was wir hier speicherfest machen wollen. Möchte man eine Library resi-
  56. dent verankern, muß man autoinit eintragen. Nun muß man die Priorität des
  57. eigenen Programms im Feld pri festlegen. Das Resident-Modul mit der höch-
  58. sten Priorität wird zuerst ausgeführt. Ich empfehle hier -1 oder -2, denn
  59. wird der Wert kleiner oder gleich -60, wird das Programm nicht mehr aus-
  60. geführt, sondern sofort der Bootvorgang gestartet. Die Adresse des Codes
  61. (die wir von AllocMem() bekommen haben) muß in das Feld init eingetragen
  62. werden.
  63.  
  64. Jetzt ist die Adresse des resetfesten Codes noch in das Feld MyMemList.me[0].
  65. addr und die Länge in MyMemList.me[0].length einzutragen. Das war der erste
  66. MemList-Eintrag.
  67.  
  68. Als zweiten MemList-Eintrag müssen wir den Resident-Record nehmen:
  69.  
  70. MyMemList.me[1].addr:=ADR(MyResident)  (z.B.)
  71. MyMemList.me[1].length:=SIZE(Resident)
  72.  
  73. Der nächste Schritt ist, daß die Adresse des Resident-Records in das Feld
  74. MyPtrTable.adr1 geschrieben werden muß.
  75.  
  76. Nun muß der PtrTable-Record (bzw. ein Zeiger darauf) als dritter Eintrag
  77. in die MemList:
  78.  
  79. MyMemList.me[2].addr:=ADR(MyPtrTable) (z.B.)
  80. MyMemList.me[2].length:=8             (2 Longwords=8 Bytes)
  81.  
  82. Der vierte Eintrag der MemList muß ein Zeiger auf die MemList selbst sein:
  83.  
  84. MyMemList.me[3].addr:=ADR(MyMemList)
  85. MyMemList.me[3].length:=SIZE(NewMemList)
  86.  
  87. Nun muß man die Adresse der MemList in den ExecBase-Zeiger KickMemPtr
  88. eintragen:
  89.  
  90. execBase^.kickMemPtr:=ADR(MyMemList);
  91.  
  92. In den ExecBase-Zeiger KickTagPtr kommt die Adresse der zwei Zeiger:
  93.  
  94. execBase^.kickTagPtr:=ADR(MyPtrTable);
  95.  
  96. Jetzt muß noch die Resident-Prüfsumme berechnet werden. Da tut sich ein
  97. Problem auf: das Exec-Definitionsmodul ist da fehlerhaft! Die Funktion
  98. SumKickData() liefert einen LONGINT-Wert zurück! Kein Problem, ein ge-
  99. patchtes Exec.def befindet sich in diesem Directory. Also:
  100.  
  101. MyCheckSum:=SumKickData();
  102.  
  103. Und nun noch die Checksumme eintragen:
  104.  
  105. execBase^.kickCheckSum:=MyCheckSum;
  106.  
  107.  
  108.             ***** FERTIG! *****
  109.  
  110.  
  111. Beim nächsten Reset wird dann, sofern der Code O.K. ist, das resetfeste
  112. Maschinenprogramm ausgeführt.
  113.  
  114. Man kann also mit DevPac oder Profimat oder sonst einem Assembler ein
  115. Programm PC-relativ(!!!) schreiben, abspeichern und z.B. mit M2ACODE (von
  116. [fbs]) in INLINE-Statements packen. Wie schon gesagt, für die praktische
  117. Anwendung sind MakeKickRes oder Observer (vollständig in Assembler) viel-
  118. leicht ganz brauchbare Beispiele.
  119.  
  120. Es ist somit ein Modula-Programm denkbar, das dann irgendeinen Handler
  121. resident installiert, der z.B. auf Tastendruck das Fast-Memory abschaltet,
  122. oder ...
  123.  
  124.  
  125.     Viel Spaß noch,
  126.  
  127.             Holger
  128.  
  129.  
  130.  
  131.  
  132.